/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package org.cip.esymons.colegiatura.beans;

import com.lowagie.text.pdf.codec.Base64.OutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import org.cip.esymons.colegiatura.bc.CargoEmpleadoDelegate;
import org.cip.esymons.colegiatura.bc.ColegiadoDelegate;
import org.cip.esymons.colegiatura.bc.ColegiadoImagenDelegate;
import org.cip.esymons.colegiatura.bc.EmpleadoDelegate;
import org.cip.esymons.colegiatura.bc.PersonaNaturalDelegate;
import org.cip.esymons.colegiatura.bc.solicitanteDelegate;
import org.cip.esymons.colegiatura.be.Colegiado;
import org.cip.esymons.colegiatura.be.ColegiadoImagen;
import org.cip.esymons.general.be.Cargo;
import org.cip.esymons.general.be.CargoEmpleado;
import org.cip.esymons.general.be.CargoEmpleadoPK;
import org.cip.esymons.general.be.Empleado;
import org.cip.esymons.general.be.PersonaNatural;

/**
 *
 * @author WILLIAM GASTAÑUEDI CABALLERO
 */
public class EmpleadoController {

    //DECALRACION DE CLASES.
    private EmpleadoDelegate delegadoEmpleado;
    private PersonaNaturalDelegate delegadoPersona;
    private ColegiadoDelegate delegadoColegiado;
    private solicitanteDelegate delegadoSolicitante;
    private ColegiadoImagenDelegate delegadoColImagen;
    private CargoEmpleadoDelegate delegadoCargoEmpleado;
    private Empleado empleado;
    private PersonaNatural persona;
    private Colegiado colegiado;
    private Cargo cargo;
    private CargoEmpleado cargoEmpleado,cargoEmpleado2;
    private CargoEmpleadoPK cargoEmpleadoPK;

    private String cantidad;
    private String dni, apePat, apeMat, nombre, ruc,codigoCIP;
    private Boolean soloColegiados,noHallado,otroCargo;

    List<PersonaNatural> listaPersonasFotos;
    List<PersonaNatural> listaPersonas;
    List<CargoEmpleado> listaEmpleadosCIP;
    List<CargoEmpleado> listaCargosXEmpleado;

    //CONSTRUCTOR DE CLASES.
    public EmpleadoController() {

        delegadoColegiado =  new ColegiadoDelegate();
        delegadoEmpleado = new EmpleadoDelegate();
        delegadoPersona = new PersonaNaturalDelegate();
        delegadoColImagen = new ColegiadoImagenDelegate();
        delegadoSolicitante = new solicitanteDelegate();
        delegadoCargoEmpleado =  new CargoEmpleadoDelegate();

        colegiado = new Colegiado();
        persona = new PersonaNatural();
        empleado = new Empleado();
        cargo = new Cargo();
        cargoEmpleado = new CargoEmpleado();
        cargoEmpleado2 = new CargoEmpleado();
        cargoEmpleadoPK = new CargoEmpleadoPK();

        listaPersonasFotos = new ArrayList<PersonaNatural>();
        listaPersonasFotos = null;
        listaPersonas = new ArrayList<PersonaNatural>();
        listaPersonas = null;
        listaEmpleadosCIP = new ArrayList<CargoEmpleado>();
        listaEmpleadosCIP = null;
        listaCargosXEmpleado = new ArrayList<CargoEmpleado>();
        listaCargosXEmpleado = null;

        codigoCIP = "";
        dni = ""; apePat = ""; apeMat = ""; nombre = ""; ruc = "";
        noHallado = false;
        otroCargo = false;
    }
//GETTERS AND SETTERS
    public CargoEmpleado getCargoEmpleado2() {
        return cargoEmpleado2;
    }

    public void setCargoEmpleado2(CargoEmpleado cargoEmpleado2) {
        this.cargoEmpleado2 = cargoEmpleado2;
    }

    public List<CargoEmpleado> getListaCargosXEmpleado() {
        return listaCargosXEmpleado;
    }

    public void setListaCargosXEmpleado(List<CargoEmpleado> listaCargosXEmpleado) {
        this.listaCargosXEmpleado = listaCargosXEmpleado;
    }

    public CargoEmpleadoPK getCargoEmpleadoPK() {
        return cargoEmpleadoPK;
    }

    public void setCargoEmpleadoPK(CargoEmpleadoPK cargoEmpleadoPK) {
        this.cargoEmpleadoPK = cargoEmpleadoPK;
    }

    public String getCantidad() {
        return cantidad;
    }

    public void setCantidad(String cantidad) {
        this.cantidad = cantidad;
    }

    public List<CargoEmpleado> getListaEmpleadosCIP() {
        return listaEmpleadosCIP;
    }

    public void setListaEmpleadosCIP(List<CargoEmpleado> listaEmpleadosCIP) {
        this.listaEmpleadosCIP = listaEmpleadosCIP;
    }

    public Boolean getOtroCargo() {
        return otroCargo;
    }

    public void setOtroCargo(Boolean otroCargo) {
        this.otroCargo = otroCargo;
    }

    public CargoEmpleado getCargoEmpleado() {
        return cargoEmpleado;
    }

    public void setCargoEmpleado(CargoEmpleado cargoEmpleado) {
        this.cargoEmpleado = cargoEmpleado;
    }

    public CargoEmpleadoDelegate getDelegadoCargoEmpleado() {
        return delegadoCargoEmpleado;
    }

    public void setDelegadoCargoEmpleado(CargoEmpleadoDelegate delegadoCargoEmpleado) {
        this.delegadoCargoEmpleado = delegadoCargoEmpleado;
    }

    public Cargo getCargo() {
        return cargo;
    }

    public void setCargo(Cargo cargo) {
        this.cargo = cargo;
    }

    public String getCodigoCIP() {
        return codigoCIP;
    }

    public void setCodigoCIP(String codigoCIP) {
        this.codigoCIP = codigoCIP;
    }

    public ColegiadoImagenDelegate getDelegadoColImagen() {
        return delegadoColImagen;
    }

    public void setDelegadoColImagen(ColegiadoImagenDelegate delegadoColImagen) {
        this.delegadoColImagen = delegadoColImagen;
    }

    public solicitanteDelegate getDelegadoSolicitante() {
        return delegadoSolicitante;
    }

    public void setDelegadoSolicitante(solicitanteDelegate delegadoSolicitante) {
        this.delegadoSolicitante = delegadoSolicitante;
    }

    public Boolean getNoHallado() {
        return noHallado;
    }

    public void setNoHallado(Boolean noHallado) {
        this.noHallado = noHallado;
    }

    public String getApeMat() {
        return apeMat;
    }

    public void setApeMat(String apeMat) {
        this.apeMat = apeMat;
    }

    public String getApePat() {
        return apePat;
    }

    public void setApePat(String apePat) {
        this.apePat = apePat;
    }

    public String getDni() {
        return dni;
    }

    public void setDni(String dni) {
        this.dni = dni;
    }

    public String getNombre() {
        return nombre;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    public String getRuc() {
        return ruc;
    }

    public void setRuc(String ruc) {
        this.ruc = ruc;
    }

    public Boolean getSoloColegiados() {
        return soloColegiados;
    }

    public void setSoloColegiados(Boolean soloColegiados) {
        this.soloColegiados = soloColegiados;
    }

    public List<PersonaNatural> getListaPersonas() {
        return listaPersonas;
    }

    public void setListaPersonas(List<PersonaNatural> listaPersonas) {
        this.listaPersonas = listaPersonas;
    }

    public List<PersonaNatural> getListaPersonasFotos() {
        return listaPersonasFotos;
    }

    public void setListaPersonasFotos(List<PersonaNatural> listaPersonasFotos) {
        this.listaPersonasFotos = listaPersonasFotos;
    }

    public Colegiado getColegiado() {
        return colegiado;
    }

    public void setColegiado(Colegiado colegiado) {
        this.colegiado = colegiado;
    }

    public ColegiadoDelegate getDelegadoColegiado() {
        return delegadoColegiado;
    }

    public void setDelegadoColegiado(ColegiadoDelegate delegadoColegiado) {
        this.delegadoColegiado = delegadoColegiado;
    }

    public EmpleadoDelegate getDelegadoEmpleado() {
        return delegadoEmpleado;
    }

    public void setDelegadoEmpleado(EmpleadoDelegate delegadoEmpleado) {
        this.delegadoEmpleado = delegadoEmpleado;
    }

    public PersonaNaturalDelegate getDelegadoPersona() {
        return delegadoPersona;
    }

    public void setDelegadoPersona(PersonaNaturalDelegate delegadoPersona) {
        this.delegadoPersona = delegadoPersona;
    }

    public Empleado getEmpleado() {
        return empleado;
    }

    public void setEmpleado(Empleado empleado) {
        this.empleado = empleado;
    }

    public PersonaNatural getPersona() {
        return persona;
    }

    public void setPersona(PersonaNatural persona) {
        this.persona = persona;
    }

// METODO QUE INICIALIZA LAS CLASES.
    public void inicializa(){

        delegadoColegiado =  new ColegiadoDelegate();
        delegadoEmpleado = new EmpleadoDelegate();
        delegadoPersona = new PersonaNaturalDelegate();
        delegadoColImagen = new ColegiadoImagenDelegate();
        delegadoSolicitante = new solicitanteDelegate();
        delegadoCargoEmpleado =  new CargoEmpleadoDelegate();

        colegiado = new Colegiado();
        persona = new PersonaNatural();
        empleado = new Empleado();
        cargo = new Cargo();
        cargoEmpleado = new CargoEmpleado();
        cargoEmpleado2 = new CargoEmpleado();
        cargoEmpleadoPK = new CargoEmpleadoPK();

        listaPersonasFotos = new ArrayList<PersonaNatural>();
        listaPersonasFotos = null;
        listaPersonas = new ArrayList<PersonaNatural>();
        listaPersonas = null;
        listaCargosXEmpleado = new ArrayList<CargoEmpleado>();
        listaCargosXEmpleado = null;

        codigoCIP = "";
        dni = ""; apePat = ""; apeMat = ""; nombre = ""; ruc = "";
        noHallado = false;
        otroCargo = false;
    }

    public String nuevo(){

        return "buscaPersona";
    }


//METODO QUE PERMITE BUSCAR UN COLEGIADO POR SU NUMERO DE CIP
    public String buscaPorCip(){
       try {
        
        colegiado = new Colegiado();
        Integer cifras = codigoCIP.length();
             if(cifras<3){
                 codigoCIP = "0000"+ codigoCIP;
             }else{
                   if(cifras<4){
                       codigoCIP = "000"+codigoCIP;
                   }else{
                       if(cifras<5){
                           codigoCIP = "00"+codigoCIP;
                       }else{
                           if(cifras<6){
                              codigoCIP = "0"+codigoCIP;
                           }
                       }
                   }
             }
            colegiado = delegadoColegiado.buscaPorCip(codigoCIP);
            persona = new PersonaNatural();
            persona = delegadoPersona.buscaXCodigo(colegiado.getSolCodigo());
            colegiado = new Colegiado();
            codigoCIP = "";
            cargoEmpleado = new CargoEmpleado();
            cargoEmpleadoPK = new CargoEmpleadoPK();
            return "registraEmpleado";
          

        } catch (Exception e) {

            return null;
        }
    }
//METODO QUE NOS PERMITE BUSCAR UN COLEGIADO POR NOMBRES, APELLIDOS, DNI O RUC
//DEVOLVIENDO UNA LISTA DE POSIBLES OPCIONES A LAS CUALES LES ADJUNTA SU FOTO.
    public String buscarColegiado(){

        try{
            ruc = "";
            soloColegiados = false;
            ColegiadoImagen foto = new ColegiadoImagen();

            listaPersonasFotos = new ArrayList<PersonaNatural>();
            listaPersonas = new ArrayList<PersonaNatural>();
            listaPersonas = delegadoSolicitante.buscarPerNatural(dni, apePat, apeMat, nombre, ruc, soloColegiados);
            if(listaPersonas.size()>0){
                for(PersonaNatural per : listaPersonas ){

                    Long codigoPer = per.getSolCodigo();
                    foto = delegadoColImagen.buscaFoto(codigoPer);
                    if(foto != null) {
                       per.setFoto(foto);
                    }
                    listaPersonasFotos.add(per);
                }
                dni = "";
                apePat = "";
                apeMat ="";
                nombre = "";
        }else{
            noHallado = true;
        }
        }catch(Exception ex){

            return null;
        }
      return null;
    }
//METODO QUE PERMITE MOSTRAR LAS FOTOS DE LOS COLEGIADOS QUE SE ENCUENTRAN
//ALMACENADAS EN EL SERVIDOR.
    public void drawImagenListaFotos(OutputStream output, Object object) throws IOException{

        PersonaNatural person = new PersonaNatural();

        try {
             Integer index = new Integer(object.toString());
             person = listaPersonasFotos.get(index);
             File file = new File(person.getFoto().getCimRuta());
             FileInputStream inputStream = new FileInputStream(file);
             int tamañoInput = inputStream.available();
             byte[] datos = new byte[tamañoInput];
             inputStream.read(datos, 0, tamañoInput);
             output.write(datos, 0, tamañoInput);

        } catch (Exception e) {

        }
    }
//METODO QUE PERMITE SELECCIONAR UNA PERSONA Y OBTENER SUS ATRIBUTOS.
    public String seleccionar(){

        try{
            Long codigo = persona.getSolCodigo();
            persona = new PersonaNatural();
            persona = delegadoPersona.buscaXCodigo(codigo);
            cargoEmpleado = new CargoEmpleado();
            cargoEmpleadoPK = new CargoEmpleadoPK();
            listaPersonas = new ArrayList<PersonaNatural>();
            listaPersonasFotos = new ArrayList<PersonaNatural>();

            return "registraEmpleado";
        }catch(Exception ex){
            return null;
        }
    }
//METODO QUE PERMITE REGISTRAR UN EMPLEADO QUE TRABAJAN EN EL CIPCDLL.
//LOS DATOS PERSONALES LOS EXTRAEMOS PARA EDITARLOS SI YA SE ENCUENTRAN EN LA
//BASE DE DATOS.
    public String registraEmpleado(){

        try{
            delegadoPersona.edit(persona);
            empleado.setFkPerCodigopna(persona.getSolCodigo());
            empleado.setPersonaNatural(persona);
            delegadoEmpleado.edit(empleado);

            cargoEmpleado.setCargo(cargo);
            cargoEmpleado.setEmpleado(empleado);

            cargoEmpleadoPK.setFkCarCodigo(cargo.getCarCodigo());
            cargoEmpleadoPK.setFkPerCodigoemp(empleado.getFkPerCodigopna());

            cargoEmpleado.setCargoEmpleadoPK(cargoEmpleadoPK);
            delegadoCargoEmpleado.create(cargoEmpleado);

            cargoEmpleado = new CargoEmpleado();
            cargo = new Cargo();
            empleado = new Empleado();
            persona = new PersonaNatural();
            cargoEmpleadoPK = new CargoEmpleadoPK();

            mostrarMensaje("INFO: ", "Empleado registrado satisfactoriamente...", FacesMessage.SEVERITY_INFO);
            getlistaEmpleados();

            return "listar";
        }catch(Exception ex){
            mostrarMensaje("ADVERTENCIA: ", "Hubo un error al registrar el empleado", FacesMessage.SEVERITY_WARN);
            return "listar";
        }
    }
//METODO QUE PERMITE REGISTRAR UN EMPLEADO QUE TRABAJAN EN EL CIPCDLL.
//CREAMOS UN NUEVO REGISTRO DE PERSONA EN LA BASE DE DATOS.
    public String registraNewEmpleado(){

        try{
            delegadoPersona.create(persona);
            empleado.setFkPerCodigopna(persona.getSolCodigo());
            empleado.setPersonaNatural(persona);
            delegadoEmpleado.edit(empleado);

//            cargoEmpleado.setCemFechinicio(empleado.getEplFechainicio());
            cargoEmpleado.setCargo(cargo);
            cargoEmpleado.setEmpleado(empleado);

            cargoEmpleadoPK.setFkCarCodigo(cargo.getCarCodigo());
            cargoEmpleadoPK.setFkPerCodigoemp(empleado.getFkPerCodigopna());

            cargoEmpleado.setCargoEmpleadoPK(cargoEmpleadoPK);
            delegadoCargoEmpleado.create(cargoEmpleado);

            cargoEmpleado = new CargoEmpleado();
            cargoEmpleadoPK = new CargoEmpleadoPK();

            cargoEmpleado = new CargoEmpleado();
            cargo = new Cargo();
            empleado = new Empleado();
            persona = new PersonaNatural();
            cargoEmpleadoPK = new CargoEmpleadoPK();
 
            mostrarMensaje("INFO: ", "Empleado registrado satisfactoriamente...", FacesMessage.SEVERITY_INFO);
            getlistaEmpleados();
            
            return "listar";
        }catch(Exception ex){
            mostrarMensaje("ADVERTENCIA: ", "Hubo un error al registrar el empleado", FacesMessage.SEVERITY_WARN);
            return "listar";
        }
    }

//LISTAMOS LOS CARGOS QUE PUEDA TENER UN TRABAJADOR DEL CIPCDLL.
    public List<CargoEmpleado> listarCargosXEmpleado(Long codigo){

        try{
            listaCargosXEmpleado = new ArrayList<CargoEmpleado>();
            listaCargosXEmpleado = delegadoCargoEmpleado.cargosXEmpleado(codigo);

            return listaCargosXEmpleado;
        }catch(Exception ex){
            mostrarMensaje("ADVERTENCIA: ", "El empleado no tiene cargos", FacesMessage.SEVERITY_WARN);
            return new ArrayList<CargoEmpleado>();
        }

    }
//METODO QUE PRECARGA LOS DATOS DEL TRABAJADOR DEL CIPCDLL, PARA LUEGO EDITARLOS.
    public String editar(){

        Long codigo;
        empleado = new Empleado();
        codigo = cargoEmpleado.getEmpleado().getPersonaNatural().getSolCodigo();

        empleado = delegadoEmpleado.buscaEmpleado(codigo);
        listarCargosXEmpleado(codigo);

        return "ir_a_editar";
    }

//METODO QUE PERMITE EDITAR LOS DATOS DE UN TRABAJADOR DEL CIPCDLL.
    public String editarEmpleado(){

        try{
            delegadoPersona.edit(empleado.getPersonaNatural());
            delegadoEmpleado.edit(empleado);

            cargoEmpleado = new CargoEmpleado();
            cargo = new Cargo();
            empleado = new Empleado();
            persona = new PersonaNatural();
            cargoEmpleadoPK = new CargoEmpleadoPK();
            getlistaEmpleados();

            mostrarMensaje("INFO: ", "Empleado actualizado satisfactoriamente...", FacesMessage.SEVERITY_INFO);
            return "listar";
        }catch(Exception ex){
            mostrarMensaje("ADVERTENCIA: ", "No se realizo la actualización", FacesMessage.SEVERITY_WARN);
            return "listar";
        }
    }

    public String agregarCargo(){

        otroCargo = true;
        return null;
    }

//METODO QUE PERMITE ASIGNARLE OTRO CARGO A UN TRABAJADOR DEL CIPCDLL.
    public String agregaCargoXEmpleado(){

        try{
            cargoEmpleadoPK = new CargoEmpleadoPK();
            cargoEmpleado2.setCargo(cargo);
            cargoEmpleado2.setEmpleado(empleado);

            cargoEmpleadoPK.setFkCarCodigo(cargo.getCarCodigo());
            cargoEmpleadoPK.setFkPerCodigoemp(empleado.getFkPerCodigopna());

            cargoEmpleado2.setCargoEmpleadoPK(cargoEmpleadoPK);
            delegadoCargoEmpleado.create(cargoEmpleado2);

            cargoEmpleado2 = new CargoEmpleado();
            cargoEmpleadoPK = new CargoEmpleadoPK();

            otroCargo = false;
            listarCargosXEmpleado(empleado.getFkPerCodigopna());

            mostrarMensaje("INFO: ", "Se registro el cargo satisfactoriamente...", FacesMessage.SEVERITY_INFO);
            return null;
        }catch(Exception ex){
            otroCargo = false;
            mostrarMensaje("ADVERTENCIA: ", "Hubo un error al registrar el cargo", FacesMessage.SEVERITY_WARN);
            return null;
        }
    }

//LISTAMOS TODOS LOS TRABAJADORES QUE SE ENCUENTRAN EN EL CIPCDLL.
    public List<CargoEmpleado> getlistaEmpleados(){

        listaEmpleadosCIP = new ArrayList<CargoEmpleado>();
        listaEmpleadosCIP = delegadoCargoEmpleado.findAll();
        cantidad = "Nro de Listados: "+listaEmpleadosCIP.size();
        return listaEmpleadosCIP;
    }
//METODO QUE ANULA EL PROCESO DE REGISTRO DE EMPLEADOS
    public String cancelar(){

        inicializa();
        getlistaEmpleados();
        return "listar";
    }
//METODO QUE PERMITE ACTUALIZAR EL ESTADO DE LA VARIABLE QUE NOS INDICA SI
//SE HALLO A LA PERSONA QUE SE BUSCABA EN EL SISTEMA.
    public String buscarEnSistema(){

        noHallado = true;
        return null;
    }
//METODO QUE INICIALIZA LAS CLASES PARA REGISTRAR UN NUEVO EMPLEADO.
    public String nuevoEmpleado(){

        inicializa();
        return "newEmpleado";
    }
//METODO QUE PERMITE REMOVER O QUITAR DE LA RELACION A UN EMPLEADO DEL CIPCDLL.
    public String remover(){

        try{
            delegadoCargoEmpleado.remove(cargoEmpleado);
            cargoEmpleado = new CargoEmpleado();
            cargoEmpleado = new CargoEmpleado();
            cargo = new Cargo();
            empleado = new Empleado();
            persona = new PersonaNatural();
            getlistaEmpleados();

            mostrarMensaje("INFO: ", "Empleado fue removido...", FacesMessage.SEVERITY_INFO);
            return null;
        }catch(Exception ex){
          mostrarMensaje("ADVERTENCIA: ", "Hubo un error al remover el empleado", FacesMessage.SEVERITY_WARN);
          return null;

        }
    }

    public void mostrarMensaje(String resumen, String detalle, FacesMessage.Severity severidad) {
        try {
            FacesMessage fm = new FacesMessage(severidad, resumen, detalle);
            FacesContext.getCurrentInstance().addMessage(fm.toString(), fm);
        } catch (Exception e) {
            FacesMessage fm = new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), e.getMessage());
            FacesContext.getCurrentInstance().addMessage(fm.toString(), fm);
        }
    }

}
